import { AxiosResponse } from 'axios'
import { defineStore } from 'pinia'
import goodStorage from 'good-storage'
import { ShopCart, initShopcart } from './state'
import shopCartApi from '@/api/ShopCartApi'
import storage, { OPTION } from '@/utils/goodstorageutil'

// 购物车相关 store
export default defineStore('shopstore', {
  state: () => {
    return {
      shopCartList: initShopcart, // 相关用户购物车列表
    }
  },
  getters: {
    // 获取相关用户购物车列表
    getShopCartList(state): ShopCart[] {
      // 如果 pinia 的 state 中没有就从 Local Storage 本地缓存中取
      return state.shopCartList.length > 0 ? state.shopCartList : goodStorage.get('shopcartlist')
    },
  },
  actions: {
    // 重新给购物车列表赋值(触发响应式从而刷新页面)
    storeShopCartList(shopcartList: ShopCart[]) {
      this.shopCartList = shopcartList
      storage.set('shopcartlist', shopcartList) // 同步到缓存中
    },

    // 根据用户id获取相关购物车列表
    async findCurUserShopCartLst(userid: number) {
      const result: AxiosResponse<ShopCart[]> = await shopCartApi.getShopCartList(userid) // 根据用户id获取相关购物车列表
      this.shopCartList = result.data // 保存到 state 中
      goodStorage.set('shopcartlist', result.data) // 保存到浏览器 Local Storage 中
    },

    // 添加图书到购物车 
    async addBookToShopCart(shopcart: ShopCart) {
      const result: AxiosResponse<ShopCart> = await shopCartApi.addBookToShopCart(shopcart) // 获取添加到购物车中的图书信息

      this.shopCartList = storeShopCart(result)// 更新购物车数量 保存到 pinia 的 state 中
    },

    // 更新购物车中图书数量
    async appOrSubtrBookFrmShopCart(shopcart: ShopCart) {
      const result: AxiosResponse<ShopCart> = await shopCartApi.appOrSubtrBookFrmShopCart(shopcart) // 获取添加到购物车中的图书信息
      this.shopCartList = storeShopCart(result) // 更新购物车数量 保存到 pinia 的 state 中
    },

    // 根据购物车id从购物车表中删除一本书
    async delBookFrmSC(shopcartid: number) {
      const result: AxiosResponse<number> = await shopCartApi.delBookFrmSC(shopcartid)
      if (result.data > 0) {
        // 后端已经删除购物车中对应的一本书
        storage.remove('shopcartlist', OPTION.ADDORAPPENDOBJTOARR, 'shopcartid', shopcartid)
        this.shopCartList = storage.get('shopcartlist', OPTION.ADDORAPPENDOBJTOARR) // 根据缓存中最新的购物车列表更新 pinia 中的 state 数据
      }
    }
  }
})


// 保存购物车对象
function storeShopCart(result: AxiosResponse<ShopCart>) {
  const dbShopCart: ShopCart = result.data
  dbShopCart.checked = true // 点击了增加或减少时把选中状态修改为 true
  const shopCartList: ShopCart[] = storage.set('shopcartlist', dbShopCart, OPTION.ADDORAPPENDOBJTOARR, 'shopcartid', dbShopCart.shopcartid)
  return shopCartList
}
